package cn.aishua.util;

import java.util.List;

import android.content.Context;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import android.util.Log;

/**
 * Helps us check the network status.
 * 
 * @author larry
 */
public class NetworkState {

	public static boolean isAvailable(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		if (cm != null)
			return cm.getActiveNetworkInfo() != null;
		return false;
	}

	public static boolean isWifiAvailable(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.getType() == ConnectivityManager.TYPE_WIFI) {
			return true;
		}
		return false;
	}

	public static boolean isMobileNetworkAvailable(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo info = cm.getActiveNetworkInfo();
		if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE) {
			return true;
		}
		return false;
	}

	public static boolean is3gAvailable(Context context) {
		if (!isMobileNetworkAvailable(context))
			return false;
		TelephonyManager tm = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		Log.d("test", "info " + tm.getDataActivity() + ", " +
				tm.getDataState() + ", " + tm.getNetworkType());
		return false;
	}

	public static boolean isGpsEnabled(Context context) {
		LocationManager lm = ((LocationManager) context
				.getSystemService(Context.LOCATION_SERVICE));
		List<String> accessibleProviders = lm.getProviders(true);

		return accessibleProviders != null && accessibleProviders.size() > 0;
	}
	
	public static boolean isConnectionFast(int type, int subType){
        if(type==ConnectivityManager.TYPE_WIFI){
            System.out.println("CONNECTED VIA WIFI");
            return true;
        }else if(type==ConnectivityManager.TYPE_MOBILE){
            switch(subType){
            case TelephonyManager.NETWORK_TYPE_1xRTT:
                return false; // ~ 50-100 kbps
            case TelephonyManager.NETWORK_TYPE_CDMA:
                return false; // ~ 14-64 kbps
            case TelephonyManager.NETWORK_TYPE_EDGE:
                return false; // ~ 50-100 kbps
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
                return true; // ~ 400-1000 kbps
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
                return true; // ~ 600-1400 kbps
            case TelephonyManager.NETWORK_TYPE_GPRS:
                return false; // ~ 100 kbps
//            case TelephonyManager.NETWORK_TYPE_HSDPA:
//                return true; // ~ 2-14 Mbps
//            case TelephonyManager.NETWORK_TYPE_HSPA:
//                return true; // ~ 700-1700 kbps
//            case TelephonyManager.NETWORK_TYPE_HSUPA:
//                return true; // ~ 1-23 Mbps
            case TelephonyManager.NETWORK_TYPE_UMTS:
                return true; // ~ 400-7000 kbps
            // NOT AVAILABLE YET IN API LEVEL 7
//            case Connectivity.NETWORK_TYPE_EHRPD:
//                return true; // ~ 1-2 Mbps
//            case Connectivity.NETWORK_TYPE_EVDO_B:
//                return true; // ~ 5 Mbps
//            case Connectivity.NETWORK_TYPE_HSPAP:
//                return true; // ~ 10-20 Mbps
//            case Connectivity.NETWORK_TYPE_IDEN:
//                return false; // ~25 kbps 
//            case Connectivity.NETWORK_TYPE_LTE:
//                return true; // ~ 10+ Mbps
            // Unknown
            case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                return false; 
            default:
                return false;
            }
        }else{
            return false;
        }
    }

	public static boolean tempTest(Context context) {
		ConnectivityManager cm = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		TelephonyManager tm = (TelephonyManager) context
				.getSystemService(Context.TELEPHONY_SERVICE);
		return ((cm.getActiveNetworkInfo() != null && cm
				.getActiveNetworkInfo().getState() == NetworkInfo.State.CONNECTED) || tm
				.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS);
	}

}
